;-----------定义GDT描述符的结构 ----------------

%macro	Descriptor  3
	dw	%2 &0FFFFh	;段界限1共2字节
	dw	%1 &0FFFFh	;段基址1共2字节
	db	(%1>>16)&0FFh	;段基址1共1字节
	dw	((%2>>8)&0F00h)|(%3&0F0FFh)  ;属性1共半字节+段界限2共半字节+属性2共1字节	
	db	(%1>>24)&0FFh	;段基址2共1字节
%endmacro



%macro Gate 4
	dw	(%2 & 0FFFFh)				; 偏移1
	dw	%1					; 选择子
	dw	(%3 & 1Fh) | ((%4 << 8) & 0FF00h)	; 属性
	dw	((%2 >> 16) & 0FFFFh)			; 偏移2
%endmacro 

%macro	IGate 3
	dw	(%2&0FFFFh)	;偏移1 共2字节
	dw	%1		;选择子 共2字节
	db	0		;属性保留
	db	%3		;属性 一字节保留，一字节属性
	dw	((%2>>16)&0FFFFh)	;偏移2 共2字节	
%endmacro

	


;----------描述符属性---------------------------
;.P位存在位。P=1表示在内存址哦能否存在;P=0表示段在内存中不存在
; .DPL描述符特权级.0，1，2，3.数字越小特权值越大
; .S位指明描述符是数据段/代码段描述符(S=1)还是系统段/门描述符(S=0)
; .TYPE描述符类型
;---------TYPE值-------数据段和代码段描述符--------系统段和门描述符-----
;-----------0------------------只读------------------<未定义>-----------
;-----------1------------------只读,已访问-----------286TSS-------------
;-----------2------------------读/写-----------------LDT----------------
;-----------3------------------读/写,已访问----------忙的286TSS---------
;-----------4------------------只读,向下扩展---------286调用门----------
;----------5------------------只读,向下扩展,以访问--任务门-------------
;----------6------------------读/写,向下扩展--------286中断门----------
;----------7------------------读/写,向下扩展,以访问-286陷阱门----------
;----------8------------------只执行----------------<未定以>-----------
;-----------9------------------只执行,以访问---------可用386TSS---------
;----------A------------------执行/读---------------<未定仪>-----------
;----------B------------------执行/读,以访问--------忙的386TSS---------
;----------C------------------只执行,一致码段-------386调用门----------
;-----------D------------------只执行,一致码段,已访问-<未定义>----------
;-----------E------------------执行/读,一致码段-------386中断门---------
;----------F------------------执行/读，一致码段，已访问--386陷阱门-----

;.G位段界限粒度位.G=0时段界限粒度为字节;G=1时段界限粒度为4K
;.D/B位
;在可执行代码段描述符中,这一位为D位.D=1,指令32位地址及32/8操作数
;------------------------------------D=0,指令16位地址及16/8操作数
;在向下扩展数据段的描述符中,这位叫做B位.B=1,段的上部界限位4GB
;---------------------------------------B=0,段界限上部界限为64KB
;在描述堆栈段的描述符中,这位叫做B位。B=1时，使用32位堆栈指针寄存器esp
;------------------------------------B=0时，使用16位堆栈指针寄存器sp

DA_32		EQU	4000h		;0100_0000_0000_0000
;描述符权限类型
DA_DPL0		EQU	00000000b	;DPL=0
DA_DPL1		EQU	00100000b	;DPL=1
DA_DPL2		EQU	01000000b	;DPL=2
DA_DPL3		EQU	01100000b	;DPL=3	
;储存段描述符
DA_DR		EQU	10010000b	;存在只读数据段类型值
DA_DRW		EQU	10010010b	;存在可读写数据段类型值
DA_DRWA		EQU	10010011b	;存在以访问可读写数据段类型
DA_C		EQU	10011000b	;存在只执行代码段类型值(非一致代码段)
DA_CR		EQU	10011001b	;存在可执行可读的代码段类型
DA_CC		EQU	10011100b	;存在只执行一致代码段类型
DA_CCR		EQU	10011101b	;存在可执行可读的一致代码段
DA_LIMIT_4K	EQU	8000h		;4k对齐

;系统段描述符
DA_LDT		EQU	10000010b	;局部描述符
DA_TaskGate	EQU	10000101b	;任务门描述符
DA_386TSS	EQU	10001001b	;386TSS
DA_386CGate	EQU	10001100b	;386调用门
DA_386IGate	EQU	10001110b	;386中断门
DA_386TGate	EQU	10001111b	;386陷阱门
SA_TIL		EQU	0100b		;选择子T1位
SA_RPL3		EQU	0011b		
SA_RPL0		EQU	0000b
SA_RPL1		EQU	0001b
SA_RPL2		EQU	0010b

;页表属性
PG_P		EQU	0001b	;存在页表
PG_R		EQU	0000b	;只读
PG_RW		EQU	0010b	;可读可写
PG_U		EQU	0100b	;用户级别
PG_S		EQU	0000b	;系统级别
